package com.baidu.redis.controller;

import com.baidu.redis.util.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import io.rebloom.client.Client;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @auther zzyy
 * @create 2021-05-09 17:06
 */
@RestController
@Slf4j
public class BloomFilterController {
    @Autowired
    private Client rebloomClient;
    @Autowired
    private Client rebloomClient2;

    /**
     * 头条app每次推荐 18条数据
     * 因为大数据流服务每次推送18条数据 这个是人家大数据部门流相关来定义的
     */
    final int SIZE = 18;

    /**
     * 拉取18条推荐数据
     */
    @GetMapping(value = "/rebloom")
    public List<Integer> rebloom(String userid) {
        String key = Constants.REBLOOM + userid;
        List<Integer> list = new ArrayList<>();
        while (true) {

            //步骤1：到 大数据信息流服务 获取18条数据
            List<Integer> ids = this.getArticle18_ByBigData();

            //步骤2：到布隆过滤器 过滤已读的数据
            String[] array = new String[ids.size()];
            for (int i = 0; i < ids.size(); i++) {
                array[i] = String.valueOf(ids.get(i));
            }
            //判断当前18条数据是否有已经存在的数据
            boolean[] bos = this.rebloomClient.existsMulti(key, array);
            boolean[] bos2 = this.rebloomClient2.existsMulti(key, array);

            for (int i = 0; i < ids.size(); i++) {
                boolean bo = bos[i];
                //bo等于
                // true:布隆过滤器存在，
                // false布隆过滤器不存在
                if (!bo) {
                    //布隆过滤器里面还没有，推送给客户的新内容新闻
                    log.info("布隆过滤器中还没有，可以推送给客户{}", ids.get(i));
                    list.add(ids.get(i));
                } else {
                    log.info("布隆过滤器中已存在，过滤掉不能推送给客户:{}", ids.get(i));
                }
                //达到18条  就退出死循环 退出当前for循环
                if (list.size() == SIZE) {
                    break;
                }
            }

            //退出当前while循环
            if (list.size() == SIZE) {
                break;
            }
        }

        log.info("本次推送给客户的内容:{}", list.toString());

        //暂停几秒钟线程
        //try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }

        //步骤3：把本次的18条数据加入到布隆过滤器里面，代表已读
        String[] array = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            array[i] = String.valueOf(list.get(i));
        }
        boolean[] booleans = this.rebloomClient.addMulti(key, array);
        boolean[] booleans2 = this.rebloomClient2.addMulti(key, array);
        log.info("加入到布隆过滤器里面，代表已读:{}", list.toString());
        return list;
    }

    /**
     * 模拟大数据 信息流服务
     * 从新闻源10W里面获取18条数据，
     */
    public List<Integer> getArticle18_ByBigData() {
        Random rand = new Random();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < SIZE; i++) {
            int id = rand.nextInt(100000);
            list.add(id);
        }
        //获取18条数据，
        return list;
    }


    /**
     * 为某个用户 模拟1万条 已读数据
     */
    @GetMapping(value = "/init")
    public void init(Integer userid) {
        String[] array = new String[10000];
        for (int i = 0; i < 10000; i++) {
            array[i] = String.valueOf(i);
        }
        boolean[] booleans = this.rebloomClient.addMulti(Constants.REBLOOM + userid, array);
        boolean[] booleans2 = this.rebloomClient2.addMulti(Constants.REBLOOM + userid, array);
        System.out.println();
    }


}
